关于引用
本文通过实际代码描述了C与lua的引用
c代码:
#include "windows.h"
#include <iostream.h>
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#pragma comment(lib,"lua5.1.lib")
lua_State * L;
static int clib(lua_State *L) //给lua调用的c函数必须定义成static int XXX(lua_State *L)
{
const char *buff = luaL_checkstring(L, -1);
//从栈顶弹出一个值
lua_pop(L, 1);
//lua_pop(L, -1); //清栈
//创建索引并从栈顶弹出该对象
int ref = luaL_ref(L, LUA_REGISTRYINDEX);
//根据索引取lua对象并压栈
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
if (!lua_isfunction(L, -1))
{
printf("call back function is not valid:%d", ref);
return 0;
}
//压入参数
lua_pushstring(L, buff);
//运行
lua_pcall(L, 1, 0,0);
const char * err = luaL_checkstring(L, 1);
printf("%d,err:%s/n", lua_gettop(L), err);
luaL_unref(L, LUA_REGISTRYINDEX, ref);
return 0; //为什么要返回1?这是有依据的,该函数把结果压入了栈,lua调用该函数将从栈中
//取1个结果 */
}
static const luaL_reg lengine[] = {
{"clib", clib},
{NULL, NULL},
};
int main ( int argc, char *argv[] )
{
//创建一个指向lua解释器的指针
L = luaL_newstate();
//加载lua标准库
luaL_openlibs(L);
//注册C++函数
lua_register(L,"clib",clib);
//加载脚本
luaL_register(L, "lengine", lengine);
luaL_dofile(L,"1.lua");
//调用函数
// lua_getglobal(L,"run");
//运行函数并把结果压入栈
// lua_pcall(L,0,0,0);
//关闭并释放资源
lua_close(L);
return 0;
}
lua代码:
local b = {}
function b.a(str)
print("OK")
print("lua" .. str)
end
lengine.clib(b.a, "test")
